package edu.server.dominio;

import java.util.LinkedList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;

import edu.server.repositorio.OrdenCompraProducto;
import edu.server.repositorio.RenglonOrdenCompraProducto;
import edu.server.util.HibernateUtil;

public class D_OrdenCompraProducto {
	
	public D_OrdenCompraProducto()
	{
		
	}
	
	/**
	 * Método que registra los datos de una orden de compra de producto.
	 * @param ordenCompra. Orden de compra a registrar.
	 */
	public void registrar(OrdenCompraProducto ordenCompra)
	{
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		try{
			session.beginTransaction();
			session.saveOrUpdate(ordenCompra);
			session.getTransaction().commit();
		}
		
		catch(HibernateException he)
		{
			session.getTransaction().rollback();	
			throw he;
		}
	}
	
	
	/**
	 * Método que registra los renglones de una orden de compra de producto.
	 * @param renglones. Renglones a registrar.
	 */
	public void registrarRenglones(List<RenglonOrdenCompraProducto> renglones)
	{
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		try
		{
			session.beginTransaction();
			
			for(RenglonOrdenCompraProducto renglon : renglones)
				session.saveOrUpdate(renglon);
			
			session.getTransaction().commit();
		}
		
		catch(HibernateException he)
		{
			session.getTransaction().rollback();
			throw he;
		}
	}
	
	/**
	 * Método que busca los renglones de una orden de compra en particular.
	 * @param idOrdenCompra. Id de la orden de compra para la cual se quiere recuperar sus renglones.
	 * @return List<RenglonOrdenCompraProducto>. Retorna una lista con los renglones de la orden de compra de producto.
	 */
	@SuppressWarnings("unchecked")
	public List<RenglonOrdenCompraProducto> buscarRenglones(int idOrdenCompra)
	{
		List<RenglonOrdenCompraProducto> renglones = new LinkedList<RenglonOrdenCompraProducto>();
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		String hql = "from RenglonOrdenCompraProducto" +
					" where ordenCompraProducto.idOrdenCompra = " + idOrdenCompra +
					" order by idRenglonOrdenCompraProducto ";
		
		renglones = session.createQuery(hql).list();
		
		session.close();
		
		return renglones;
	}
	
	
	/**
	 * Método que cambia de estado la orden de compra de producto con el id pasado como parámetro
	 * @param idOrdenesCompraProducto, nuevo estado
	 */
	public void cambiarEstadoOrdenCompraProducto(List<Integer> ids, String estado)
	{
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		try{
			
			session.beginTransaction();
			
			//por cada id pasado como parámetro, buscamos la orden de compra y le seteamos el nuevo estado
			for(int idOrden : ids)
			{
				OrdenCompraProducto orden = (OrdenCompraProducto) session.get(OrdenCompraProducto.class, idOrden);
			
				orden.setEstado(estado);
				
				session.saveOrUpdate(orden);
			}
			
			session.getTransaction().commit();
		}
		
		catch(HibernateException he)
		{
			session.getTransaction().rollback();
			
			throw he;
		}
	}
	
	/**
	 * Método que filtra las órdenes de compra de producto por el proveedor de la misma
	 * @param proveedor. Proveedor de la orden de compra de producto.
	 * @return List<OrdenCompraProducto>. Retorna una lista con las órdenes de compra de producto.
	 */
	@SuppressWarnings("unchecked")
	public List<OrdenCompraProducto> buscarPorProveedor(String proveedor, String estado)
	{
		List<OrdenCompraProducto> ordenes;
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();	
		
		String hql = "from OrdenCompraProducto ";
		
		if(estado != null)
			hql = hql + "where estado like '" + estado + "'";
		
		if(proveedor != null)
		{
			if(estado != null)
				hql = hql + " and proveedor.nombre like '" + proveedor + "'";
			
			else
				hql = hql + "where proveedor.nombre like '" + proveedor + "'";
		}
		
		ordenes = session.createQuery(hql).list();
		
		for(OrdenCompraProducto orden : ordenes)
			Hibernate.initialize(orden.getProveedor());
		
		session.close();
		
		return ordenes;
	}
	
	
	/**
	 * Método que busca toda la información de una orden de compra de producto
	 * @param idOrdenCompraProducto
	 * @return OrdenCompraProductoDTO.
	 */
	public OrdenCompraProducto buscarOrdenCompraProductoCompleta(int idOrdenCompraProducto)
	{
		OrdenCompraProducto orden = new OrdenCompraProducto();
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		orden = (OrdenCompraProducto) session.get(orden.getClass(), idOrdenCompraProducto);
		
		if(orden != null)
		{
			Hibernate.initialize(orden.getProveedor());
			Hibernate.initialize(orden.getModoEnvio());
			Hibernate.initialize(orden.getRenglonOrdenCompraProductos());
		}
		
		session.close();
		
		
		return orden;
	}
	
	/**
	 * Método que busca en la base de datos un renglón con el id pasado como parámetro
	 * @param idRenglon. Id del renglón que se intenta recuperar.
	 * @return RenglonOrdenCompraProducto. Renglon que tiene el id pasado como parámetro.
	 */
	public RenglonOrdenCompraProducto buscarRenglon(int idRenglon)
	{
		RenglonOrdenCompraProducto renglon;
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		renglon = (RenglonOrdenCompraProducto)session.get(RenglonOrdenCompraProducto.class, idRenglon);
		
		session.close();
		
		return renglon;
	}
	
	/**
	 * Método que elimina todos los renglones de una orden de compra
	 * @param idOrden. Orden de compra para la cual se quieren eliminar sus renglones
	 */
	public void eliminarRenglones(int idOrden)
	{
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		try
		{
			session.beginTransaction();
			
			String hql = "delete " +
						 "from RenglonOrdenCompraProducto " +
						 "where ordenCompraProducto.idOrdenCompra = " + idOrden;
			
			session.createQuery(hql).executeUpdate();
			
			session.getTransaction().commit();
		}
		
		catch(HibernateException he)
		{
			session.getTransaction().rollback();
			throw he;
		}
	}
}
